﻿using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using System.Xml;
using System.IO;
using System;

// V1.0 - Cree le 12 aout 2014 par Florian OLIVARI
// Contient toutes les informations de configuration du jeu
public class ConfigManager {

	public event EventHandler ConfigDone;
	public event EventHandler LoadedXML;

	private TextAsset _defaultConfig;
	private string _filePath;
	private Dictionary<string, List<String>> _input;

	private string _vsync;
	private string _format;
	private string _resolution;
	private string _fullscreen;

	// Constructeur du configManger
	public ConfigManager(string filepath){

		// Recuperer le fichier de configuration par defaut
		_defaultConfig = (TextAsset) Resources.Load("configDefault");  

		//Verifier la validite des parametres
		if (filepath == null || filepath == "") {
			throw new Exception("Le chemin indique pour la localisation est mal renseigne !");
		}

		// Valuer le chemin de sortie envoye par l'utilisateur
		_filePath = filepath;
	}

	// Charge le contenu du fichier xml
	public void load(){

		// Initialiser le dictionnaire des commandes du jeu
		_input = new Dictionary<string, List<string>> ();

		// Creer l'element qui va nous permettre de recuperer le document xml
		XmlDocument xmlDoc = new XmlDocument ();

		// Verifier qu'un fichier de configuration a ete cree
		if (File.Exists (_filePath)) {

			// Recuperer le fichier de configuration cree par l'application de l'utilisateur
			xmlDoc.Load (_filePath);
		}

		// Dans le cas ou le fichier de configuration n'a pas ete cree et que le seul le fichier de configuration par defaut existe
		else {

			// Charger le TextAsset charge par defaut dans le constructeur
			xmlDoc.LoadXml (_defaultConfig.text);
		}

		// Creer une liste recuperant la racine du fichier xml
		XmlNodeList configList = xmlDoc.GetElementsByTagName("config");

		// tourner en boucle dans le noeud
		foreach (XmlNode configInfo in configList) {

			// Acceder aux elements du xml
			XmlNodeList configContent = configInfo.ChildNodes;

			// Boucler dans les elements
			foreach (XmlNode configItems in configContent) {

				// Bloc d'identification du nom des noeuds enfants du xml
				switch (configItems.Name) {

					// On est dans le cas ou on est dans la liste des input des boutons
					case "InputConfig":

						// on entre dans ce noeud pour recuperer la liste des inputs
						XmlNodeList inputConfigList = configItems.ChildNodes;

						// on boucle dans le noeud
						foreach (XmlNode inputConfigItems in inputConfigList) {
							
							// On boucle dans la liste des actions utilisateurs (appeles action)
							if (inputConfigItems.Name == "Action") {

								// Creation d'une liste contenant les input possibles sur une action
								List<string> inputs = new List<string>();
								
								// Recuperer les enfants 
								XmlNodeList actionList = inputConfigItems.ChildNodes;
								
								// Inserer l'input dans la liste des input
								inputs.Add(actionList[1].InnerXml);
								inputs.Add(actionList[2].InnerXml);
								
								Debug.Log (actionList[0].InnerXml);
								Debug.Log (actionList[1].InnerXml + " " + actionList[2].InnerXml);

								// Stocker l'action dans le dictionnaire des inputs
								_input.Add(actionList[0].InnerXml, inputs);
							}
						}
						break;

					// On est dans le cas ou on est dans la configuration de la resolution
					case "Resolution":
						_resolution = configItems.InnerXml;
						break;

					// On est dans le cas ou on est dans la configuration de la synchronisation verticale
					case "VSync":
						_vsync = configItems.InnerXml;
						break;

					// On est dans le cas ou on est dans la configuration du mode plein-ecran/fenetre
					case "FullScreen":
						_fullscreen = configItems.InnerXml;
						break;

					// On est dans le cas ou on est dans la configuration du format d'ecran (16:9, 16:10, 4:3, etc)
					case "Format":
						_format = configItems.InnerXml;
						break;
				}
			}
		}

		// Dispatcher l'evt quand le chargement et la compression du xml est terminée
		// LoadedXML(this, EventArgs.Empty);
	}

	// Sauvegarde la configuration envoye par l'utilisateur dans le fichier xml
	public void saveConfig(){
	
	}

	// Apliquer la configuration 
	public void applyConfig(){
	
	}

	// Modifier la valeur de la synchro verticale
	public void setVSync(string value){
		_vsync = value;
	}

	// Modifier le format d'affichage du jeu
	public void setFormat(string value){
		_format = value;
	}

	// Modifier la resolution (qualite) d'image du jeu
	public void setResolution(string value){
		_resolution = value;
	}

	// Modifier le plein ecran ou le mode fenetre en jeu
	public void setFullScreen(string value){
		_fullscreen = value;
	}
}
